package main

import "fmt"

// 值类型： 基本数据类型：int系列 、float系列 byte  bool string 、数组  和  struct
// 值类型-变量直接存储值
// 引用类型： 指针、slice切片、map、管道chan、interface等
// 引用类型-变量存储的是一个地址
func main() {

	testPtrBase()
	fmt.Println()
	fmt.Println()
	testPtrPractise()
	test0208()

}

func testPtrBase() {

	var num int = 10
	fmt.Println("num的地址=", &num) //num的地址= 0xc00000a0f8

	//prt  变量名 *数据类型 = ？
	//ptr：变量名
	//*int：类型
	var ptr *int = &num
	fmt.Println("指针ptr=", ptr)       //指针ptr= 0xc00000a0f8
	fmt.Println("指针ptr指向的值=", *ptr)  //指针ptr指向的值= 10
	fmt.Println("指针ptr自己的地址=", &ptr) //指针ptr自己的地址= 0xc0000660d8

	var name = "rose"
	var ptr1 *string = &name
	fmt.Printf("%T %v \n", ptr1, ptr1)

	var ptr1V = *ptr1
	fmt.Printf("%T %v \n", ptr1V, ptr1V)
	var ptr2ptr = &ptr1V
	fmt.Printf("%T %v \n", ptr2ptr, ptr2ptr)

}

func testPtrPractise() {
	var a int = 10
	b := true
	fmt.Printf("a type=%T a=%v \n", a, a) //a type=int a=10
	fmt.Printf("b type=%T b=%v \n", b, b) //b type=bool b=true

	var a1 *int = &a
	var b1 *bool = &b
	fmt.Printf("a1指针=%v, a1指针的地址=%v \n", a1, &a1) //a1指针=0xc00000a120, a1指针的地址=0xc0000660e0
	fmt.Printf("b1指针=%v, b1指针的地址=%v \n", b1, &b1) //b1指针=0xc00000a128, b1指针的地址=0xc0000660e8

	var num int = 9
	var ptr *int = &num
	fmt.Printf("num值=%v ,num地址=%v\n", num, ptr) //num值=9 ,num地址=0xc00000a130
	num = 10
	fmt.Printf("num值=%v ,num地址=%v\n", num, ptr) //num值=10 ,num地址=0xc00000a130

	var num1 uint64 = 66
	var ptr1 *uint64 = &num1
	fmt.Printf("num1值=%v ,num1地址=%v\n", num1, ptr1) //num1值=66 ,num1地址=0xc00000a138
	num1 = 100.0
	ptr1 = &num1
	fmt.Printf("num1值=%v ,num1地址=%v\n", num1, ptr1) //num1值=100 ,num1地址=0xc00000a138
	fmt.Printf("num1地址指向的值=%v \n", *ptr1)           //num1地址指向的值=100

}

func test0208() {
	var num1 int = 10
	var ptr1 *int = &num1
	fmt.Printf("类型=%T 值=%v 地址指向的值=%v", ptr1, ptr1, *ptr1)

}
